package dao.implementacao.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import model.Aluno;
import dao.ConnectionPool;
import dao.FabricaDAO;
import dao.assinatura.IAlunoDAO;

public class AlunoDAO implements IAlunoDAO
{
	private DataSource dataSource;
	
	public AlunoDAO() {
		ConnectionPool connectionPool = FabricaDAO.createCoonectionPool();
		this.dataSource = connectionPool.getDataSource();
	}
	
	@Override
	public void addAluno(Aluno aluno) 
	{
		try 
        {  
			Connection con = dataSource.getConnection();
		 	String sql = "insert into aluno(cod_alu,nome,endereco,cpf,telefone,cod_ins_alu,cod_usuario_alu) values(?,?,?,?,?,?,?)";
		 	PreparedStatement comando = con.prepareStatement(sql);
		 	comando.setInt(1, aluno.getCodigo());
            comando.setString(2, aluno.getNome());
            comando.setString(3, aluno.getEndereco());
            comando.setString(4, aluno.getCpf());
            comando.setString(5, aluno.getTelefone());
            comando.setInt(6, aluno.getInstituicao());
            comando.setString(7, aluno.getLogin());
            comando.setString(8, aluno.getSenha());
            comando.execute();
            comando.close();
        } catch (Exception e) 
        {  
        	e.printStackTrace();
        }		
		
		addNotaAluno(aluno);
	}

	@Override
	public void updateAluno(Aluno aluno) 
	{
		try 
        {  
			Connection con = dataSource.getConnection();
			String sql = "update aluno set nome=? , endereco = ?, cpf = ?, telefone = ?,cod_ins_alu = ?,login=?,senha=? where cod_alu=?";
		 	PreparedStatement comando = con.prepareStatement(sql);
            comando.setString(1, aluno.getNome());
            comando.setString(2, aluno.getEndereco());
            comando.setString(3, aluno.getCpf());
            comando.setString(4, aluno.getTelefone());
            comando.setInt(5, aluno.getInstituicao());
            comando.setString(6, aluno.getLogin());
            comando.setString(7, aluno.getSenha());
            comando.setInt(8, aluno.getCodigo());
            comando.execute();
            comando.close();
        } catch (Exception e) 
        {  
        	e.printStackTrace();
        }	
	}

	@Override
	public void deleteAluno(Aluno aluno) 
	{
		try 
        {  
			Connection con = dataSource.getConnection();
		 	String sql = "delete from aluno where cod_alu=?";
		 	PreparedStatement comando = con.prepareStatement(sql);
            comando.setInt(1, aluno.getCodigo());
            comando.execute();
            comando.close();
        } catch (Exception e) 
        {  
        	e.printStackTrace();
        }		
	}

	@Override
	public Aluno getAlunoById(int id) 
	{
		Aluno retorno = null;
		
		try 
		{		
			String sql = "select * from aluno where cod_alu ="+id;
			Connection con = dataSource.getConnection();
			Statement s = con.createStatement();	
			ResultSet rs = s.executeQuery(sql);	
			
			if(rs.next()){
				int codigo = rs.getInt("cod_alu");
				String nome = rs.getString("nome");
				String endereco = rs.getString("endereco");
				String cpf = rs.getString("cpf");
				String telefone = rs.getString("telefone");
				String login = rs.getString("login");
				String senha = rs.getString("senha");
				
				retorno = new Aluno(codigo,nome,endereco,cpf,telefone,getNotaAluno(id),login,senha);
			}
			
			s.close();
			rs.close();
			
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}	
		
		return retorno;
	}
	
	public List<Double> getNotaAluno(int id)
	{
		List<Double> notas = new ArrayList<Double>();
		
		try 
		{		
			String sql = "select * from nota where cod_alu_nota ="+id;
			Connection con = dataSource.getConnection();
			Statement s = con.createStatement();	
			ResultSet rs = s.executeQuery(sql);	
			
			while(rs.next())
			{
				notas.add(rs.getDouble("valor"));
			}
			
			s.close();
			rs.close();
			
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}	
		
		return notas;		
	}

	public void addNotaAluno(Aluno aluno)
	{
		List<Double> notas = aluno.getNota();
		try 
        {  
			Connection con = dataSource.getConnection();
		 	String sql = "insert into nota(valor,cod_alu_nota) values(?,?)";
		 	PreparedStatement comando = con.prepareStatement(sql);
		 	
		 	for(double nota : notas)
		 	{
		 		comando.setDouble(1, nota);
	            comando.setInt(2, aluno.getCodigo());
	            comando.execute();
		 	}
		 	
            comando.close();
        } catch (Exception e) 
        {  
        	e.printStackTrace();
        }		
	}
	
	@Override
	public List<Aluno> getAlunos() 
	{
		List<Aluno> aluno = new ArrayList<Aluno>();
		try 
		{		
			String sql = "select * from aluno";
			Connection con = dataSource.getConnection();
			Statement s = con.createStatement();	
			ResultSet rs = s.executeQuery(sql);	
			
			while(rs.next())
			{
				int codigo = rs.getInt("cod_alu");
				String nome = rs.getString("nome");
				String endereco = rs.getString("endereco");
				String cpf = rs.getString("cpf");
				String telefone = rs.getString("telefone");
				List<Double> notas = getNotaAluno(codigo);
				String login = rs.getString("login");
				String senha = rs.getString("senha");
				
				aluno.add(new Aluno(codigo,nome,endereco,cpf,telefone,notas,login,senha));
			}
			
			s.close();
			rs.close();
			
		} catch (SQLException e) 
		{
			e.printStackTrace();
		}	
		
		return aluno;
	}

	@Override
	public void finalizaConexaoAluno() {
		try {
			Connection con = dataSource.getConnection();
			con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
